package com.oracle.application.filter;

import com.alibaba.fastjson.JSONObject;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import com.oracle.application.empty.vo.R;
import org.apache.http.HttpStatus;
import org.springframework.http.MediaType;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author 莉丝妲黛
 */
public class TestFilter extends ZuulFilter {
    /**
     * 过滤器的类型。可选值有：
     * pre - 前置过滤
     * route - 路由后过滤
     * error - 异常过滤
     * post - 远程服务调用后过滤
     */
    @Override
    public String filterType() {
        return "null";
    }

    /**
     * 同种类的过滤器的执行顺序。
     * 按照返回值的自然升序执行。
     */
    @Override
    public int filterOrder() {
        return 2;
    }
    /**
     * 返回boolean类型。代表当前filter是否生效。
     * 默认值为false。
     * 返回true代表开启filter。
     */
    @Override
    public boolean shouldFilter() {
        System.out.println("判断执行filter的方法");
        System.out.println("11111");
        System.out.println("22222");
        //那些请求需要 用户想信息 需要吧登陆后的响应头token在发送这个请求时携带 请求头中
        RequestContext context=RequestContext.getCurrentContext();
        HttpServletRequest request =context.getRequest();
        String requestToken = request.getHeader("token");
        if (requestToken==null||"".equals(requestToken)) {
            //这次请求是否具备执行下面Run方法的代码
            //以前是 获取session 判断 有没有登录
            return true;
        }
        if (!"aabbc".equals(requestToken)) {
            return true;
        }
        return false;
    }

    /**
     * run方法就是过滤器的具体逻辑。
     * return 可以返回任意的对象，当前实现忽略。（spring-cloud-zuul官方解释）
     * 直接返回null即可。
     */
    @Override
    public Object run() throws ZuulException {
        System.out.println("核心的filter方法");
        //请求是否需要向下进行路由 或者是其他一些业务
        RequestContext context = RequestContext.getCurrentContext();
        //设置给前台的一个响应信息
        context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);//.valeu
        HttpServletResponse response =context.getResponse();
        response.setContentType(MediaType.APPLICATION_JSON_UTF8.toString());
        context.setResponse(response);
        R responseR= new R(401, "errorInfo",null);
        context.setResponseBody(JSONObject.toJSONString(responseR));
        context.setSendZuulResponse(false);
        return null;
    }
}
